home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr45 / convt2sn.zip / CONV2SND.PAS < prev    next >
Pascal/Delphi Source File  |  1993-02-03  |  16KB  |  440 lines

  1. (* Convert to Deskmate Sound, version 1.98      PUBLIC DOMAIN
  2.    Kenneth Udut
  3.    January 14 - 27, 1993
  4.  
  5.    PURPOSE:  This program converts any regular digitized sound into a
  6.    DeskMate Sound file.  It will allow you to use Deskmate's SOUND program
  7.    to edit these files.
  8.  
  9.    My thanks to Christopher Taveres for his program SOUNDOFF, written for
  10.    the Tandy 1000 SL/TL machines to play digitized sounds.  I do hope he
  11.    doesn't mind me borrowing his DeskMate .SND file structure information,
  12.    but I am new at this file distribution thing.
  13.  
  14. ----------------------------------------
  15. DeskMate .SND file structure thanks to:
  16. /* Sound Off!
  17. /* Written by Christopher Taveres 
  18. /* Copyright (c) January 1992
  19. /* Falsoft, Inc.
  20. /* PCM
  21. ----------------------------------------
  22.  
  23.    This program is 100% public domain.  Use it as you will, play with the
  24.    source code, use the source code, and even ask money for your revised
  25.    versions of it!
  26.  
  27.    Just give me a BIG THANKS and, if you don't wish to FREELY distribute
  28.    YOUR source code, -please- make it available for others for a SMALL fee.
  29.  
  30.    Thanks!                            --Kenneth Udut, age 20, 14-JAN-1993
  31.  
  32. P.S. - This is Ken on 24-JAN-1993.  Creating a header in TP wasn't the answer,
  33.        so I'm going to attempt to just write the bytes for the header directly.
  34.        Wish me Luck!
  35.  
  36. P.P.S. - Ken again, on the day before his birthday.  It's 27-JAN-1993, and
  37.          I *should* be going to work.  I've decided to release this program
  38.          *NOW*, in its current form.
  39.  
  40.          Needed improvements:
  41.  
  42.             * Ability to change playback rate (in next version)
  43.  
  44.             * Accurate method of writing the filesize in the header.
  45.               (currently, it's a close approximation, but you still
  46.               have to manually cut off a couple of samples at the end)
  47.  
  48.               NOTE: Files 255 bytes or under change PERFECTLY!  :-)
  49.  
  50.             * DeskMate Interface (okay - wishful thinking, but if I can
  51.               find someone with the SDK, I might ask them to do me a BIG
  52.               favor!!!
  53.  
  54.             * Ability to cut off the old header, if one, before adding
  55.               on the new header.
  56.  
  57.             * Ability to switch back and forth between DIFFERENT sound
  58.               file types, including DeskMate's, WAV files, etc.
  59.  
  60.             * Ability to decode Instrument files into their separate parts.
  61.  
  62.   While this is just a wish list, and the only NEEDED one is the accurate
  63.   method of encoding sound file size, and possibly the playback rate, it's
  64.   still things to look forward to.
  65.  
  66.   If you like what you see, or don't like it, or think it needs BIG help,
  67.   give me a call at (908) 241-6246, or write me a note at:
  68.  
  69.   Kenneth Udut 170 East Clay Avenue, Roselle Park, NJ USA 07204-2050
  70.   Internet: kudut@hamp.hampshire.edu
  71.   PC-Link/America Online: K Udut
  72.   CompuServe: INTERNET> kudut@hamp.hampshire.edu
  73.   Delphi: kudut@hamp.hampshire.edu
  74.  
  75.   If you're in New Jersey, and want to stop by my 'workshop', please do!
  76.   I'll have a pot of tea or coffee waiting for you, and we can sit down
  77.   and chat!  (Just give me a call first or leave me a note!  Thanks! :D )
  78.  
  79.                       --Ken, on January 27, 1993, day before 21st birthday!
  80.  
  81.  
  82. THIS IS THE STRUCTURE AS I RECEIVED IT.  AS I KNOW -NOTHING- ABOUT C, THIS
  83. IS GOING TO BE A *BIT* OF A CHALLENGE, BUT, SINCE I DON'T KNOW MUCH ABOUT
  84. PASCAL EITHER, LIFE SHOULD BE A LITTLE SIMPLER!
  85.  
  86. struct dmheader {                  /* Structure of the header block      */
  87.        INT marker;                 /* Marker bytes - should be 00 1a     */
  88.        CHAR note_count;            /* Number of notes in instrument file */
  89.        CHAR inst_num;              /* Instrument number                  */
  90.        CHAR inst_name[10];         /* Instrument name                    */
  91.        INT sample_rate;            /* Sampling rate                      */
  92.        CHAR filler[16];            /* I don't know what this does        */
  93.        unsigned long sample_size;  /* Number of samples in file          */
  94.        CHAR filler2[8];            /* More unknown space                 */
  95. *)
  96.  
  97.  
  98. {pseudo-program - 'cause it seems to help program development!
  99.  
  100.     define deskmate sound header.
  101.     start program.
  102.     print_banner;   (* glory lines *)
  103.  
  104.     IF no command_line_parameters THEN message1 ELSE BEGIN
  105.        search for file listed in command_line_parareter.
  106.        IF file doesn't exist THEN message2
  107.        check file length;
  108.        sample_size := file length - # of bytes in header.
  109.        sample_rate := fixed rate or another command line parameter.
  110.  
  111.        open new file called DM_SOUND.SND for writing
  112.        add header to beginning of DM_SOUND.SND
  113.        open FILENAME.SOU for reading
  114.        add FILENAME.SOU to end of DM_SOUND.SND
  115.        CLOSE FILENAME.SOU
  116.        CLOSE new file.
  117.  
  118.        report success or failure in operation;
  119.        say our goodbyes;
  120.        print_end_banner;
  121.  
  122.     print_banner:
  123.     WRITELN('xxx program by Kenneth Udut');
  124.  
  125.     message1:
  126.     WRITELN('You must specify xxx arguements');
  127.     print_end_banner;
  128.  
  129.     message2:
  130.     WRITELN('file xxx doesn't exists');
  131.     print_end_banner;
  132.  
  133.     print_end_banner:
  134.     WRITELN('write the author xxxxxx');
  135.     halt;
  136.     END.
  137.  
  138. }
  139.  
  140.  
  141.  
  142.  
  143.         (* THE REAL PROGRAM NOW FOLKS!!! HOLD ON TO YOUR HATS! *)
  144.  
  145.  
  146.  
  147.  
  148. PROGRAM DM_Sound_Cnv;
  149.  
  150. USES Dos, Crt;
  151.  
  152. CONST
  153.       dm_soundfile = 'DM_SOUND.SND';
  154.       z = CHR(0);                     {saves typing, 24-JAN-1993}
  155.  
  156. VAR header : STRING;
  157.     sample_size : LONGINT;
  158.     sample_rate : BYTE;       {merely carries indication of which size it is}
  159.     sound_name  : string[10]; {Name that appears in DeskMate SOUND.PDM}
  160.     human_name  : string;     {for silliness.}
  161.  
  162. PROCEDURE Perm; assembler;
  163. ASM
  164.    JMP @@1
  165.    DB 13,10,13,10,13,10,13,10,'03-FEB-1993 by Kenneth Udut.  Always 100% Public Domain.',13,10
  166.    DB 13,10,'adonis_note: CONVERTS RAW DIGITIZED SOUNDS TO DESKMATE .SND FORMAT',13,10,13,10,13,10,13,10
  167. @@1:
  168. END;
  169.  
  170.  
  171. PROCEDURE start_banner;
  172. BEGIN
  173.      WRITELN('CONV2SND - Version 1.98, by Kenneth Udut, February 3, 1993 - Public Domain');
  174.      WRITELN('           Converts "other" digitized sound formats to DeskMate .SND format');
  175.      WRITELN('           for use with the DeskMate SOUND.PDM program for editing purposes!');
  176.      WRITELN;
  177.      WRITELN('           Syntax: CONV2SND ROCKY.VOC, where ROCKY.VOC is *any* digitized sound');
  178.      WRITELN('_______________________________________________________________________________');
  179. END;
  180.  
  181.  
  182. PROCEDURE end_banner;
  183. BEGIN
  184.    WRITELN('_______________________________________________________________________________');
  185.    WRITELN('Catch ya later, my friend!  Drop me a note, ',human_name,', - I promise I''ll reply!');
  186.    WRITELN;
  187.    WRITELN('Kenneth Udut, 170 East Clay Avenue, Roselle Park, NJ 07204-2050');
  188.    WRITE('kudut@hamp.hampshire.edu     908/241-6246     February 3, 1993');
  189.    halt;
  190. END;
  191.  
  192.  
  193.  
  194. PROCEDURE check_command_line;
  195. BEGIN
  196.   IF ParamCount <> 1 THEN BEGIN
  197.     WRITELN('You have specified either NO filenames, TOO MANY filenames, or tried switches.');
  198.     WRITELN('Since this program only asks for one (1) filename, then all you need to do is:');
  199.     WRITELN;
  200.     WRITELN('   If the sound file you wish to convert is called BULLWINK, simply type ... ');
  201.     WRITELN('   CONV2SND BULLWINK ');
  202.     WRITELN;
  203.     WRITELN('First, CONV2SND creates a little 44 byte "header" which contains the info ');
  204.     WRITELN('that DeskMate SOUND.PDM needs to consider this file a DeskMate .SND file.');
  205.     WRITELN;
  206.     WRITELN('A new, empty file is created called DM_SOUND.SND.  The header is copied to');
  207.     WRITELN('the beginning of this file.  Then the contents of BULLWINK are read and');
  208.     WRITELN('copied into DM_SOUND.SND, right after that all-important header.');
  209.     WRITELN;
  210.     WRITELN('Lastly, the files are safely closed, and you have two files: BULLWINK and');
  211.     WRITELN('DM_SOUND.SND.  RENAME DM_SOUND.SND TO BULLWINK.SND FOR CLARITY!');
  212.     WRITELN;
  213.     WRITELN('NOTE: THE SIZE OF THE FREE SPACE ON YOUR DISK MUST BE THE SIZE OF THE FILE ');
  214.     WRITELN('      TIMES 2.  IN OTHER WORDS, A 100k FILE NEEDS 200k FREE SPACE TO CONVERT.');
  215. end_banner
  216. END;
  217.  
  218. END;
  219.  
  220.  
  221. PROCEDURE NOT_HERE;
  222. BEGIN
  223.      WRITELN;
  224.      WRITELN('The file you specified, "',ParamStr(1),'", doesn''t seem to be present.');
  225.      WRITELN('Please check your spelling, maybe do a DIR/W a couple of times, fiddle');
  226.      WRITELN('around a wee bit and give it another shot };-> ');
  227.      WRITELN;
  228.      WRITELN('adonis_note: Time is a great teacher, but unfortunately kills all its pupils.');
  229. end_banner;
  230. END;
  231.  
  232.  
  233.  
  234. (****************** WISH ME LUCK *********************)
  235. (*                                                   *)
  236. (* This is the portion where I attempt to convert a  *)
  237. (* regular sound file into an extra-special DESKMATE *)
  238. (* SND FILE!  It's the last part of the program for  *)
  239. (* me to write, as I was having too much fun procras *)
  240. (* tinating, making up the text and such!            *)
  241. (*                                                   *)
  242. (*****************************************************)
  243. PROCEDURE convert_file;
  244.  
  245. VAR
  246.   old_snd_file : FILE;
  247.   new_snd_file : FILE;
  248.   header_part  : TEXT;
  249.   samp_char_1  : CHAR;  { three characters that will make up sample rate in file}
  250.   samp_char_2  : CHAR;  { Watch for funky math coming up! }
  251.   samp_char_3  : CHAR;
  252.  
  253.   NumRead, NumWritten: Word;    {for BLOCKREAD and BLOCKWRITE}
  254.   buf: array[1..2048] of Char;
  255.  
  256. BEGIN
  257.  
  258. ASSIGN(old_snd_file, ParamStr(1));
  259. RESET(old_snd_file, 1);
  260. sample_size := FileSize(old_snd_file);
  261. WRITELN;
  262. WRITELN('Hey, ',human_name,'?  ',paramstr(1), ' contains ',sample_size,' samples.');
  263. WRITELN;
  264. ASSIGN(header_part, dm_soundfile);
  265. REWRITE(header_part);
  266.  
  267. (*Writing part - wish me luck here!  I will write the header, close the
  268.   file, then reopen it as a -plain- file! *)
  269.  
  270. { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . }
  271.  
  272. (* 24-JAN-1993 - Uh oh!  I'm going to try to write the header file bit by bit!
  273.    Let's see if it really works!  Creating a "file of record" didn't work. *)
  274.  
  275. WRITE(header_part, CHR(26), z, CHR(1), z);
  276.  
  277. (* 03-FEB-1993 - Attempting to let you add a 10-character 'description' of
  278.    the sound file - the one that appears in the right hand box in SOUND.PDM *)
  279.  
  280. WRITE(header_part, sound_name);
  281.  
  282. (* 24-JAN-1993 - Next two bits I *BELIEVE* are the sampling rate, and I
  283.    can't quite be sure yet.  For future use, I'm keeping these lines
  284.    separate so that it's easier to find where it goes  Ver 1.77*)
  285. (* 03-FEB-1993 - Turns out that they ARE the sampling rate!  Now, it's changeable! *)
  286.  
  287. CASE sample_rate of
  288.      1: WRITE(header_part, CHR(124), CHR(21));     {5500}
  289.      2: WRITE(header_part, CHR(248), CHR(42));     {11000}
  290.      3: WRITE(header_part, CHR(240), CHR(85));     {22000}
  291. END;
  292.  
  293. WRITE(header_part, CHR(255), z, CHR(255), CHR(255), z, z, z, z, z, z, z, z, z, z, z, z);
  294.  
  295.  
  296. (* SAMPLE SIZE COMING UP!  I HOPE IT WORKS!  IT'S OF ULTIMATE IMPORTANCE! *)
  297. samp_char_1 := z;
  298. samp_char_2 := z;    {remember:  Z is CHR(0) }
  299. samp_char_3 := z;
  300.  
  301.  
  302. IF sample_size < 256 THEN samp_char_1 := CHR(sample_size)
  303.    ELSE BEGIN
  304.         IF sample_size < 65536 THEN
  305.            BEGIN
  306.              samp_char_1 := CHR(sample_size div 256);
  307.              samp_char_2 := CHR((sample_size div 256) + 1);
  308.              samp_char_3 := z
  309.            END
  310.      ELSE
  311.         BEGIN
  312.         samp_char_1 := CHR(sample_size div 65536); {These three get multiplied together for the}
  313.         samp_char_2 := CHR(sample_size div 65536); {final result! - neat!  27-JAN-1993}
  314.         samp_char_3 := chr((sample_size div 65536) + 1);
  315.         END;
  316.      END;
  317.  
  318. WRITE(header_part, samp_char_1, samp_char_2, samp_char_3);
  319.  
  320. WRITE(header_part, z, z, z, z, z, z, z, z, z);
  321.  
  322. { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . }
  323. CLOSE(header_part);
  324.  
  325. ASSIGN(new_snd_file, dm_soundfile);
  326. RESET(new_snd_file, 1);
  327. SEEK(new_snd_file, filesize(new_snd_file)+1);
  328.  
  329. WRITELN('All Important 44 byte header portion successfully written to ',dm_soundfile,'!');
  330. WRITELN;
  331. WRITELN('Now adding old digitized sound file to new, DeskMate format sound file.');
  332. WRITELN('Each ">" equals 2048 sound bytes.');
  333.  
  334. REPEAT
  335.   BLOCKREAD(old_snd_file,buf,
  336.             SizeOf(buf),NumRead);
  337.   BLOCKWRITE(new_snd_file,buf,NumRead,NumWritten);
  338.   WRITE('>');
  339. UNTIL (NumRead = 0) OR
  340.       (NumWritten <> NumRead);
  341.  
  342. WRITELN;
  343. CLOSE(old_snd_file);
  344. CLOSE(new_snd_file);
  345. WRITELN;
  346. WRITELN('safely closing ',ParamStr(1), ' and ',dm_soundfile,'.');
  347. END;
  348.  
  349.  
  350. procedure ask_questions;      {02-FEB-93 - for sample rate}
  351. BEGIN
  352. sample_rate := 0;
  353. sound_name := '';
  354. human_name := '';
  355. WRITELN;
  356. WRITELN('______Q_U_E_S_T_I_O_N_S______');
  357. WRITELN('                                       _________________________________ ');
  358. WRITELN('A) Select Sampling Rate.              / Sample Rate is an indication of \');
  359. WRITELN('                                      \ the rate at which SOUND.PDM  or /');
  360. WRITELN('   1) 5500  -  ''speech''               / or other  DeskMate .SND players \');
  361. WRITELN('   2) 11000 -  ''usual recordings''     \ reads and plays back  the sound /');
  362. WRITELN('   3) 22000 -  ''hi-quality / Mac''      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ');
  363. WRITELN;
  364. WRITE(CHR(7));
  365. WHILE (sample_rate < 1) OR (sample_rate > 3) DO
  366.       BEGIN
  367.       WRITE('Please Select 1, 2, or 3. > ');  READLN(sample_rate);
  368.       END;
  369. WRITELN;
  370. WRITELN;
  371. WRITELN('                                       _________________________________ ');
  372. WRITELN('B) Select Name of  Sound              / "Name of Sound" *isn''t* the name\');
  373. WRITELN('   10 Characters or Less              \  of the file being created.  It /');
  374. WRITELN('                                      /  It is the  name  that  appears \');
  375. WRITELN('   Example: Disgusting  or            \  in SOUND.PDM next to "Name:"   /');
  376. WRITELN('            Eastwood                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ');
  377. WRITE(CHR(7));
  378. WHILE sound_name = '' DO
  379.        BEGIN
  380.        WRITE('Name / Description of Sound (10 Characters or Less) > ');  READLN(sound_name);
  381.        END;
  382.  
  383. {pads string to 10 characters -- 03-FEB-1993}
  384. while length(sound_name) < 10 do  
  385. insert(chr(0),sound_name, (length(sound_name)+1));
  386.  
  387. WRITELN;
  388. WRITELN;
  389. WRITELN('C) Oh, and by the way ...');
  390. WRITELN('   My name is Ken.  What''s your name?');
  391. WRITELN;
  392. WRITE(CHR(7));
  393. WHILE human_name = '' DO
  394.       BEGIN
  395.       WRITE('Your Name? > ');  READLN(human_name);
  396.       END;
  397. WRITELN;
  398. WRITELN('Thanks for answering my questions!  Now ,',human_name,', here goes CONV2SND!!!');
  399. WRITELN;
  400. END;
  401.  
  402.  
  403. function FileExists(FileName: STRING)
  404.                                 : Boolean;
  405. { Returns True IF file exists; otherwise,
  406.   it returns False. }
  407.  
  408. VAR
  409.   f : file;
  410. BEGIN
  411.   {$I-}
  412.   ASSIGN(f, FileName);
  413.   RESET(f);
  414.   CLOSE(f);
  415.   {$I+}
  416.   FileExists := (IOResult = 0) and
  417.    (FileName <> '');
  418. END;  { FileExists }
  419.  
  420.  
  421.  
  422. BEGIN
  423. Perm;
  424. start_banner;
  425. human_name := '!';
  426. check_command_line;   {if a problem occurs, it's taken care of in this procedure}
  427.      IF NOT (FileExists(paramstr(1))) THEN NOT_HERE;
  428.  
  429. ask_questions;
  430. convert_file;
  431.  
  432. WRITELN(paramstr(1),' has been successfully converted into a DeskMate Sound file');
  433. WRITELN('100% editable by DeskMate''s Sound Editor!!!  Congratulations, ',human_name,'!!!');
  434. WRITELN;
  435. WRITELN('adonis_note: Life is a funny game ... some people play ... some people main');
  436. WRITELN('             (beginning of a famous poem, spoken to me by my Tandy 1000 TL');
  437. WRITELN;
  438. end_banner;
  439. END.
  440.